package cn.iocoder.yudao.module.reading.dal.mysql.audio;

import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.module.reading.dal.dataobject.audio.UserAudioRecordDO;
import org.apache.ibatis.annotations.Mapper;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 用户音频播放记录 Mapper
 *
 * @author 芋道源码
 */
@Mapper
public interface UserAudioRecordMapper extends BaseMapperX<UserAudioRecordDO> {

    /**
     * 根据用户ID和音频ID查询播放记录
     *
     * @param userId  用户ID
     * @param audioId 音频ID
     * @return 播放记录
     */
    default UserAudioRecordDO selectByUserIdAndAudioId(Long userId, Long audioId) {
        return selectOne(new LambdaQueryWrapperX<UserAudioRecordDO>()
                .eq(UserAudioRecordDO::getUserId, userId)
                .eq(UserAudioRecordDO::getAudioId, audioId));
    }

    /**
     * 根据用户ID查询最近播放记录
     *
     * @param userId 用户ID
     * @param limit  限制数量
     * @return 播放记录列表
     */
    default List<UserAudioRecordDO> selectRecentByUserId(Long userId, Integer limit) {
        return selectList(new LambdaQueryWrapperX<UserAudioRecordDO>()
                .eq(UserAudioRecordDO::getUserId, userId)
                .orderByDesc(UserAudioRecordDO::getLastPlayAt)
                .last(limit != null ? "LIMIT " + limit : ""));
    }

    /**
     * 根据用户ID和日期范围查询播放记录
     *
     * @param userId    用户ID
     * @param startTime 开始时间
     * @param endTime   结束时间
     * @return 播放记录列表
     */
    default List<UserAudioRecordDO> selectByUserIdAndDateRange(Long userId, LocalDateTime startTime, LocalDateTime endTime) {
        return selectList(new LambdaQueryWrapperX<UserAudioRecordDO>()
                .eq(UserAudioRecordDO::getUserId, userId)
                .between(UserAudioRecordDO::getLastPlayAt, startTime, endTime)
                .orderByDesc(UserAudioRecordDO::getLastPlayAt));
    }

    /**
     * 根据音频ID列表查询用户播放记录
     *
     * @param userId   用户ID
     * @param audioIds 音频ID列表
     * @return 播放记录列表
     */
    default List<UserAudioRecordDO> selectByUserIdAndAudioIds(Long userId, List<Long> audioIds) {
        return selectList(new LambdaQueryWrapperX<UserAudioRecordDO>()
                .eq(UserAudioRecordDO::getUserId, userId)
                .in(UserAudioRecordDO::getAudioId, audioIds));
    }

    /**
     * 统计用户播放完成的音频数量
     *
     * @param userId 用户ID
     * @return 播放完成数量
     */
    default Long countCompletedByUserId(Long userId) {
        return selectCount(new LambdaQueryWrapperX<UserAudioRecordDO>()
                .eq(UserAudioRecordDO::getUserId, userId)
                .eq(UserAudioRecordDO::getIsCompleted, true));
    }

    /**
     * 统计用户今日播放音频数量
     *
     * @param userId    用户ID
     * @param startTime 今日开始时间
     * @param endTime   今日结束时间
     * @return 今日播放数量
     */
    default Long countTodayPlayByUserId(Long userId, LocalDateTime startTime, LocalDateTime endTime) {
        return selectCount(new LambdaQueryWrapperX<UserAudioRecordDO>()
                .eq(UserAudioRecordDO::getUserId, userId)
                .between(UserAudioRecordDO::getLastPlayAt, startTime, endTime));
    }

    /**
     * 清空用户播放记录
     *
     * @param userId 用户ID
     * @return 删除数量
     */
    default int deleteByUserId(Long userId) {
        return delete(UserAudioRecordDO::getUserId, userId);
    }

    /**
     * 删除指定用户的指定音频播放记录
     *
     * @param userId  用户ID
     * @param audioId 音频ID
     * @return 删除数量
     */
    default int deleteByUserIdAndAudioId(Long userId, Long audioId) {
        return delete(new LambdaQueryWrapperX<UserAudioRecordDO>()
                .eq(UserAudioRecordDO::getUserId, userId)
                .eq(UserAudioRecordDO::getAudioId, audioId));
    }

}
